#include <bits/stdc++.h>
using namespace std;


/*
3330. 找到初始输入字符串 I
已解答
简单
相关标签
premium lock icon
相关企业
提示
Alice 正在她的电脑上输入一个字符串。但是她打字技术比较笨拙，她 可能 在一个按键上按太久，导致一个字符被输入 多次 。

尽管 Alice 尽可能集中注意力，她仍然可能会犯错 至多 一次。

给你一个字符串 word ，它表示 最终 显示在 Alice 显示屏上的结果。

请你返回 Alice 一开始可能想要输入字符串的总方案数。

 

示例 1：

输入：word = "abbcccc"

输出：5

解释：

可能的字符串包括："abbcccc" ，"abbccc" ，"abbcc" ，"abbc" 和 "abcccc" 。

示例 2：

输入：word = "abcd"

输出：1

解释：

唯一可能的字符串是 "abcd" 。

示例 3：

输入：word = "aaaa"

输出：4

 

提示：

1 <= word.length <= 100
word 只包含小写英文字母。
*/

// 法一
class Solution {
public:
    int possibleStringCount(string word) {
        // 处理空字符串的特殊情况
        if (word.empty()) return 1;

        // 存储分组结果，每个元素是{字符, 连续出现次数}
        vector<pair<char, int>> groups;
        // 当前分组字符
        char cur = word[0];
        int cnt = 1;

        // 遍历 然后分组
        for (int i = 1; i < word.size(); i++) {
            // 分组字符 与遍历得到的 相同
            if (word[i] == cur) ++cnt;
            // 新字符就存入当前结果
            else {
                groups.emplace_back(cur, cnt);
                cur = word[i];      // 开启新分组
                cnt = 1;        // 重置计数   
            }
        }

        // 存入最后一个
        groups.emplace_back(cur, cnt);
        int ans = 1;
        int multiCount = 0;  // 记录长度≥2的块数量
        for (const auto& p : groups) {
            if (p.second >= 2) {
                // 长度大于2  贡献为其长度
                ans += p.second - 1;
                multiCount++;
            }
        }

        // 如果没有长度>=2的分组，说明没有按错，方案数为1
        return multiCount > 0 ? ans : 1;
    }
};

// 法二
class Solution {
public:
    int possibleStringCount(string word) {
        // 总方案数初始化为1（即原字符串本身）
        int res = 1;
        // 当前处理的字符
        char ch = word[0];
        // 当前字符连续出现的次数
        int cnt = 1;

        // 遍历字符串中的每个字符
        for (int i = 1; i < (int)word.size(); i++) {
            if (word[i] == ch) {
                // 如果当前字符与前一个相同，增加计数
                cnt++;
            } else {
                // 遇到新字符，处理上一个连续重复块
                ch = word[i];
                if (cnt > 1) {
                    // 对于长度大于1的连续块，可以选择将其缩短为1~cnt个字符
                    // 因此增加 cnt-1 种方案（原字符串已在res=1中计算）
                    res += cnt - 1;
                }
                // 重置当前字符和计数
                cnt = 1;
            }
        }

        // 处理最后一个连续重复块
        if (cnt > 1)
            res += cnt - 1;

        // 返回总方案数
        return res;
    }
};